package com.cib.xagcjs.biz;

import com.alibaba.fastjson.JSONObject;
import com.cib.xagcjs.common.Result;
import com.cib.xagcjs.common.RmbRequest;
import com.cib.xagcjs.common.RmbResponse;
import com.cib.xagcjs.dal.PayContentMapper;
import com.cib.xagcjs.dto.PaymentRequest;
import com.cib.xagcjs.utils.CryptoUtils;
import com.cib.xagcjs.utils.RequestUtil;
import com.cib.xagcjs.utils.TimeUtil;
import com.cib.xagcjs.vo.PayContent;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * 获取支付详情实现层
 */
@Service
@Slf4j
public class PayContentService {

    @Autowired
    private RequestUtil requestUtil;

    @Autowired
    private PayContentMapper payContentMapper;

    @Autowired
    private PaymentNotifyService paymentNotifyService;

    @Autowired
    private MessageLogService messageLogService;

    @Autowired
    private ObjectMapper objectMapper;

    @Autowired
    private CryptoUtils cryptoUtils;

    public RmbResponse queryPaymentInfo(PaymentRequest req) {
        try {

            ArrayList<Object> list = new ArrayList<>();
            list.add(req);
            RmbRequest request = requestUtil.getRequest("pay/query",list);

            log.info("查看组装的报文请求：" + request);
            // 转换为JSON格式
            log.info("JSON：" + JSONObject.toJSONString(request));
            // 加密
            cryptoUtils.encryptAndSign(JSONObject.toJSONString(request));

            // 与区块链进行通信

            // 报文组装没问题后在这个位置请求区块链来获取支付详情列表 （此处模拟区块链返回的支付详情列表）
            // 根据传入的参数执行查询逻辑，这里是一个示例
            // 本批次数据的翻页号，例如本批次有1000条数据，每次返回200条数据，现在需要返回第201－400条数据，则当前批次序号为2,需补满6位，即“000002”
            List<PayContent> result = this.queryPaymentData(req.getBatch());


            // 此处模拟与后台通信，处理获取的待支付详情列表
            // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

            // 此处用于更改这个批次的通知状态 修改为 2 以获取支付详情 3 支付完成 4 已反馈结果
            int i1 = paymentNotifyService.updateStatus(req.getBatch(),2);

            // 此处用于更改这个批次详情数据数据的入账状态 修改为 1 入账成功 2 入账失败
            int j1 = payContentMapper.updateAccStatus(req.getBatch(),1);
//            int j2 = payContentMapper.updateAccStatus(req.getBATCH(),2);

            // 此处用于更改这个批次的通知状态 修改为 2 以获取支付详情 3 支付完成 4 已反馈结果
            int i2 = paymentNotifyService.updateStatus(req.getBatch(),3);

            // 详情信息表记录入库
            for (PayContent dto : result) {
                if(payContentMapper.insertContent(dto) > 0) {
                    log.info("详情主表数据入库成功!");
                } else {
                    log.info("详情主表数据入库失败!");
                }
            }

            // 消息收发入库
            if (messageLogService.insertMessageLog(1,"获取支付详情请求报文", TimeUtil.getNowTime(),JSONObject.toJSONString(request)) > 0) {
                log.info("获取支付详情请求报文入库成功!");
                if (!result.isEmpty()) {
                    if (messageLogService.insertMessageLog(2,"获取支付详情响应报文", TimeUtil.getNowTime(), objectMapper.writeValueAsString(result)) > 0) {
                        log.info("获取支付详情响应报文入库成功!");
                    } else {
                        log.info("获取支付详情响应报文入库失败!");
                    }
                }
            } else {
                log.info("获取支付详情请求报文入库失败!");
            }

            // 根据查询结果构建返回响应
            return buildSuccessResponse(result);
        } catch (Exception e) {
            log.error("查询支付详情出错", e);
            // 查询出错时返回错误响应
            return buildErrorResponse(e.getMessage());
        }
    }

    /**
     * 获取这个批次已处理的列表信息
     * @param batch 批次号
     * @return 入账状态为 1 成功的详情信息
     */
    public List<PayContent> selectList(String batch) {
        return payContentMapper.selectList(batch);
    }

    private List<PayContent> queryPaymentData(String batch) {
        // 实际的查询逻辑，根据 queryRequest 中的参数查询数据库或其他数据源
        // 根据batch查询批次时间
        String time = paymentNotifyService.findNotifyTime(batch);
        // 这里是一个示例，返回一些模拟的 PayContentDto 数据
        List<PayContent> paymentInfoList = new ArrayList<>();
        PayContent data = new PayContent();
        data.setBatch(batch);
        data.setBatchDate(time);
        data.setPayInstrucId("123456"); // Sample value for payInstrucId
        data.setPayAccno("987654321"); // Sample value for payAccno
        data.setPayAccnoName("姚炜琦"); // Sample value for payAccnoName
        data.setAccBank("ICBC"); // Sample value for accBank
        data.setAccBankName("中国农业银行松原宁江支行"); // Sample value for accBankName
        data.setAccNo("123456789"); // Sample value for accNo
        data.setAccnoName("Recipient Name"); // Sample value for accNoName
        data.setAccnoType("1"); // Sample value for accNoType
        data.setAccType("1"); // Sample value for accType
        data.setIsPrivate("1"); // Sample value for isPrivate
        data.setCurrType("1"); // Sample value for currType
        data.setAmount(BigDecimal.valueOf(1234.56)); // Sample value for amount
        data.setAccStatus(0);
        data.setAccDate(TimeUtil.getDate());
        data.setAccTime(TimeUtil.getTime());
        data.setErrorReason("");

        paymentInfoList.add(data);
        paymentInfoList.add(data);
        // 其他查询逻辑...

        return paymentInfoList;
    }

    private RmbResponse buildSuccessResponse(List<PayContent> list) {
        RmbResponse response = new RmbResponse();
        Result<List<PayContent>> successResult = Result.success(list);
        response.setResult(successResult);
        return response;
    }

    private RmbResponse buildErrorResponse(String errorMsg) {
        RmbResponse response = new RmbResponse();
        Result<String> errorResult = Result.error(errorMsg);
        response.setResult(errorResult);
        return response;
    }
}
